home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok22.lha / MakeKickRes / MakeKickRes.mod < prev    next >
Text File  |  1993-08-15  |  11KB  |  318 lines

  1. (**************************************************************
  2.  *
  3.  * :Program.    MakeKickRes.mod
  4.  * :Author.     Holger Gzella
  5.  * :Address.    Freischöffenweg 12  D-4600 Dortmund 16
  6.  * :Phone.      (0231) 85 16 02
  7.  * :Version.    1.0
  8.  * :Date.       9/7/89  22:57:50
  9.  * :Copyright.  PD
  10.  * :Language.   Modula-2
  11.  * :Translator. M2Amiga v3.2d
  12.  * :Contents.   Make your own programs reset-resident!
  13.  * :Remark.     This may be useful for assembler-freaks.
  14.  * :Remark.     Notice that all programs have to be pc-relative!
  15.  *
  16.  **************************************************************)
  17.  
  18. MODULE MakeKickRes;
  19.  
  20. FROM Arts        IMPORT Assert,TermProcedure;
  21. FROM SYSTEM      IMPORT ADR,ADDRESS,LONGSET;
  22. FROM Dos         IMPORT FileHandlePtr,Read,Close,Open,oldFile;
  23. FROM Exec        IMPORT AllocMem,GetMsg,MemReqs,MemReqSet,ReplyMsg,FreeMem,
  24.                         WaitPort,NodeType,Node,NodePtr,Resident,matchword,
  25.                         ResidentPtr,ResidentFlags,ResidentFlagSet,execBase,
  26.                         SumKickData,MemEntry;
  27. FROM Graphics    IMPORT jam1,Text,Move,SetAPen,RastPortPtr;
  28. FROM Hardware    IMPORT ciaa,CiaaPraFlags,CiaaPraFlagSet;
  29. FROM Intuition   IMPORT NewWindow,WindowPtr,OpenWindow,CloseWindow,WindowFlags,
  30.                         WindowFlagSet,IDCMPFlags,IDCMPFlagSet,IntuiText,Gadget,
  31.                         GadgetPtr,IntuiMessagePtr,Border,GadgetFlags,boolGadget,
  32.                         GadgetFlagSet,ActivationFlags,ActivationFlagSet,
  33.                         ScreenFlags,ScreenFlagSet,StringInfo,strGadget;
  34.  
  35. (* Hier werden die nötigen Typen definiert *)
  36.  
  37. TYPE PtrTable=RECORD                        (* Zwei Zeiger für KickTagPtr *)
  38.        adr1: ADDRESS;
  39.        adr2: ADDRESS;
  40.      END;
  41.  
  42.      PtrTablePtr=POINTER TO PtrTable;
  43.  
  44.      MemList=RECORD                         (* Eigene MemList für KickMemPtr *)
  45.        node      : Node;
  46.        numEntries: CARDINAL;
  47.        me        : ARRAY[0..3] OF MemEntry;
  48.      END;
  49.  
  50.      MemListPtr=POINTER TO MemList;
  51.  
  52. VAR WhichGad : GadgetPtr;
  53.     class    : IDCMPFlagSet;
  54.     WDaten,RD: NewWindow;
  55.     Fenster,R: WindowPtr;
  56.     Gadgets  : ARRAY[0..3] OF Gadget;
  57.     Texte    : ARRAY[0..2] OF IntuiText;
  58.     Rahmen,RB: Border;
  59.     xyFeld,RF: ARRAY[0..9] OF INTEGER;
  60.     Info     : StringInfo;
  61.     Nachricht: IntuiMessagePtr;
  62.     rp       : RastPortPtr;
  63.     FileName : ARRAY[0..60] OF CHAR;
  64.     UndoBuf  : ARRAY[0..60] OF CHAR;
  65.     buffer   : ADDRESS;
  66.     i        : INTEGER;
  67.     Datei    : FileHandlePtr;
  68.     MyMemList: MemListPtr;
  69.     MyResi   : ResidentPtr;
  70.     Table    : PtrTablePtr;
  71.     Summe    : LONGINT;
  72.     Rubbish  : ADDRESS;
  73.  
  74. (* Das hier ist die TermProcedure. *)
  75. PROCEDURE CleanUp;
  76.   BEGIN
  77.     IF Fenster#NIL THEN CloseWindow(Fenster); END;
  78.   END CleanUp;
  79.  
  80. (* Diese Prozedur initialisiert Gadgets, Windows usw. *)
  81.  
  82. PROCEDURE SetUpStuff;
  83.   BEGIN
  84.     xyFeld[0]:=0; xyFeld[1]:=0; xyFeld[2]:=99; xyFeld[3]:=0; xyFeld[4]:=99;
  85.     xyFeld[5]:=11; xyFeld[6]:=0; xyFeld[7]:=11; xyFeld[8]:=0; xyFeld[9]:=0;
  86.  
  87.     RF[0]:=0; RF[1]:=0; RF[2]:=189; RF[3]:=0; RF[4]:=189; RF[5]:=11;
  88.     RF[6]:=0; RF[7]:=11; RF[8]:=0; RF[9]:=0;
  89.  
  90.     WITH Rahmen DO
  91.       leftEdge:=-1; topEdge:=-1; frontPen:=1; backPen:=0; drawMode:=jam1;
  92.       count:=5; xy:=ADR(xyFeld); nextBorder:=NIL;
  93.     END;
  94.  
  95.     WITH RB DO
  96.       leftEdge:=-1; topEdge:=-1; frontPen:=1; backPen:=0; drawMode:=jam1;
  97.       count:=5; xy:=ADR(RF); nextBorder:=NIL;
  98.     END;
  99.  
  100.     FOR i:=0 TO 2 DO
  101.       WITH Texte[i] DO
  102.         frontPen:=1; backPen:=0; drawMode:=jam1; leftEdge:=1; topEdge:=2;
  103.         nextText:=NIL; iTextFont:=NIL; iText:=NIL;
  104.       END;
  105.     END;
  106.     Texte[0].iText:=ADR("    INFO    "); Texte[1].iText:=ADR(" Install it ");
  107.     Texte[2].iText:=ADR("    EXIT    ");
  108.  
  109.     WITH Info DO
  110.       buffer:=ADR(FileName); undoBuffer:=ADR(UndoBuf); maxChars:=60;
  111.       dispPos:=0; undoPos:=0; numChars:=0; dispCount:=0; cLeft:=0; cTop:=0;
  112.       layerPtr:=NIL; longInt:=0; altKeyMap:=NIL;
  113.     END;
  114.  
  115.     WITH Gadgets[3] DO
  116.       nextGadget:=NIL; leftEdge:=50; topEdge:=65;
  117.       width:=98; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  118.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  119.       gadgetRender:=ADR(Rahmen); selectRender:=NIL; gadgetText:=ADR(Texte[2]);
  120.       specialInfo:=NIL; gadgetID:=3; userData:=NIL;
  121.     END;
  122.  
  123.     WITH Gadgets[2] DO
  124.       nextGadget:=ADR(Gadgets[3]); leftEdge:=50; topEdge:=50;
  125.       width:=98; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  126.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  127.       gadgetRender:=ADR(Rahmen); selectRender:=NIL; gadgetText:=ADR(Texte[1]);
  128.       specialInfo:=NIL; gadgetID:=2; userData:=NIL;
  129.     END;
  130.  
  131.     WITH Gadgets[1] DO
  132.       nextGadget:=ADR(Gadgets[2]); leftEdge:=50; topEdge:=35;
  133.       width:=98; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  134.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  135.       gadgetRender:=ADR(Rahmen); selectRender:=NIL; gadgetText:=ADR(Texte[0]);
  136.       specialInfo:=NIL; gadgetID:=1; userData:=NIL;
  137.     END;
  138.  
  139.     WITH Gadgets[0] DO
  140.       nextGadget:=ADR(Gadgets[1]); leftEdge:=5; topEdge:=20;
  141.       width:=190; height:=10; flags:=GadgetFlagSet{}; gadgetType:=strGadget;
  142.       activation:=ActivationFlagSet{gadgImmediate,relVerify,stringCenter};
  143.       gadgetRender:=ADR(RB); selectRender:=NIL; gadgetText:=NIL; userData:=NIL;
  144.       specialInfo:=ADR(Info); gadgetID:=0;
  145.     END;
  146.  
  147.     WITH WDaten DO
  148.       leftEdge:=210; topEdge:=78; width:=200; height:=80; detailPen:=0;
  149.       blockPen:=1; idcmpFlags:=IDCMPFlagSet{gadgetUp}; checkMark:=NIL;
  150.       flags:=WindowFlagSet{windowDrag,windowDepth,activate}; bitMap:=NIL;
  151.       firstGadget:=ADR(Gadgets[0]); type:=ScreenFlagSet{wbenchScreen};
  152.       title:=ADR("MakeKickRes v1.0"); screen:=NIL;
  153.     END;
  154.  
  155.     WITH RD DO
  156.       leftEdge:=160; topEdge:=53; width:=320; height:=140; detailPen:=0;
  157.       blockPen:=1; idcmpFlags:=IDCMPFlagSet{gadgetUp}; checkMark:=NIL;
  158.       flags:=WindowFlagSet{windowDrag,windowDepth,activate}; bitMap:=NIL;
  159.       firstGadget:=NIL; type:=ScreenFlagSet{wbenchScreen}; screen:=NIL;
  160.       title:=ADR("INFO über MakeKickRes ...");
  161.     END;
  162.  
  163.     Fenster:=OpenWindow(WDaten);
  164.     Assert(Fenster#NIL,ADR("Konnte Fenster nicht öffnen."));
  165.   END SetUpStuff;
  166.  
  167. (* Diese Prozedur ist für das Info-Fenster. Nix bedeutendes. *)
  168.  
  169. PROCEDURE DisplayInfo;
  170.   BEGIN
  171.     R:=OpenWindow(RD);
  172.     Assert(R#NIL,ADR("Konnte Info-Fenster nicht öffnen."));
  173.     rp:=R^.rPort;
  174.  
  175.     SetAPen(rp,3);
  176.     Move(rp,64,20);
  177.     Text(rp,ADR("*** MakeKickRes v1.0 ***"),24);
  178.     SetAPen(rp,1);
  179.     Move(rp,68,29);
  180.     Text(rp,ADR("by HOLGER GZELLA / 1989"),23);
  181.     Move(rp,56,40);
  182.     Text(rp,ADR("Installiert ein beliebiges"),26);
  183.     Move(rp,40,49);
  184.     Text(rp,ADR("Objekt-File resetfest im Spei-"),30);
  185.     Move(rp,52,58);
  186.     Text(rp,ADR("cher, wobei die EXEC-Zeiger"),27);
  187.     Move(rp,44,67);
  188.     Text(rp,ADR("KickMemPtr und KickTagPtr be-"),29);
  189.     Move(rp,40,76);
  190.     Text(rp,ADR("nutzt werden. Zu beachten ist,"),30);
  191.     Move(rp,24,85);
  192.     Text(rp,ADR("daß das Programm PC-relativ assem-"),34);
  193.     Move(rp,28,94);
  194.     Text(rp,ADR("bliert und als Linkable oder Exec"),33);
  195.     Move(rp,32,103);
  196.     Text(rp,ADR("utable) vorliegen muß. Dann kann"),32);
  197.     Move(rp,40,112);
  198.     Text(rp,ADR("eigentlich nichts schiefgehen."),30);
  199.     Move(rp,40,121);
  200.     Text(rp,ADR("MakeKickRes ist Public-Domain."),30);
  201.  
  202.     REPEAT UNTIL NOT (gamePort0 IN ciaa.pra);
  203.  
  204.     CloseWindow(R);
  205.   END DisplayInfo;
  206.  
  207. (* AHA: hier wird's interessant: Installation eines Programms *)
  208.  
  209. PROCEDURE Install;
  210.   BEGIN
  211.  
  212.     (* Rubbish=Abfallspeicher für den Dateiheader des zu installierenden
  213.        Programms. *)
  214.  
  215.     Rubbish:=AllocMem(40,MemReqSet{chip});
  216.     Assert(Rubbish#NIL,ADR("Keine 40 Bytes CHIP mehr frei!!"));
  217.  
  218.     (* Buffer=Speicher für das zu installierende Programm (max. 20K). *)
  219.  
  220.     buffer:=AllocMem(20000,MemReqSet{memClear,chip,public});
  221.     Assert(buffer#NIL,ADR("Keine 20K CHIP-Memory mehr frei!!"));
  222.  
  223.     (* Datei öffnen *)
  224.  
  225.     Datei:=Open(ADR(FileName),oldFile);
  226.     Assert(Datei#NIL,ADR("Datei nicht gefunden!!"));
  227.  
  228.     (* Header überlesen *)
  229.  
  230.     i:=Read(Datei,Rubbish,40);
  231.  
  232.     (* Maximal 20K Programmcode lesen *)
  233.  
  234.     i:=Read(Datei,buffer,20000);
  235.  
  236.     (* Abfallspeicher freigeben und Datei schließen *)
  237.  
  238.     FreeMem(Rubbish,40);
  239.  
  240.     Assert(i#0,ADR("!¿! Das klappte was nicht !¿!"));
  241.     Close(Datei);
  242.  
  243.     (* Speicher für eigene MemList bereitstellen u. initialisieren *)
  244.  
  245.     MyMemList:=AllocMem(SIZE(MemList),MemReqSet{memClear,chip,public});
  246.     Assert(MyMemList#NIL,ADR("WAS??? Keine 48 Bytes mehr???"));
  247.  
  248.     MyMemList^.node.type:=memory;       (* Node-Type: Memory-Node *)
  249.     MyMemList^.numEntries:=1;           (* nur ein Programm resetfest *)
  250.     MyMemList^.me[0].addr:=buffer;      (* und zwar das eingelesene *)
  251.     MyMemList^.me[0].length:=i;         (* mit unbekannter Länge *)
  252.  
  253.     (* Speicher für Resident-Struktur bereitstellen u. fertigmachen *)
  254.  
  255.     MyResi:=AllocMem(SIZE(Resident),MemReqSet{memClear,chip,public});
  256.     Assert(MyResi#NIL,ADR("REBOOT! Keine 26 Bytes mehr!!"));
  257.  
  258.     MyResi^.init:=buffer;               (* eingelesene Programm resetfest *)
  259.     MyResi^.matchWord:=matchword;       (* Schlüsselword f. Kick-Reset *)
  260.     MyResi^.matchTag:=MyResi;           (* Zeiger auf sich selbst *)
  261.     MyResi^.endSkip:=LONGINT(MyResi)+LONGINT(SIZE(Resident));
  262.                                         (* Zeiger auf eigenes Ende *)
  263.     MyResi^.flags:=ResidentFlagSet{coldstart};
  264.                                         (* Flag: Programm soll resetfest sein *)
  265.     MyResi^.pri:=-1;                    (* Priorität: als letztes ausführen *)
  266.  
  267.     (* MemList-Einträge initialisieren *)
  268.  
  269.     MyMemList^.me[1].addr:=MyResi;      (* 2. Eintrag: Resident-Struktur *)
  270.     MyMemList^.me[1].length:=SIZE(Resident); (* Länge: ich glaub' 26 Bytes *)
  271.  
  272.     (* TagPtr-Tabelle mit zwei Einträgen bereitstellen (einer wird belegt) *)
  273.  
  274.     Table:=AllocMem(8,MemReqSet{memClear,chip,public});
  275.     Assert(Table#NIL,ADR("8 Bytes sind zuviel ..."));
  276.  
  277.     Table^.adr1:=MyResi;                (* Resident-Struktur in Tag-Table *)
  278.  
  279.     MyMemList^.me[2].addr:=Table;       (* Table: 3. Eintrag der MemList *)
  280.     MyMemList^.me[2].length:=8;         (* Länge: 8 Bytes *)
  281.  
  282.     MyMemList^.me[3].addr:=MyMemList;        (* 4. Eintrag: MemList selbst *)
  283.     MyMemList^.me[3].length:=SIZE(MemList);  (* Länge: ich mein' 48 Bytes *)
  284.  
  285.     execBase^.kickMemPtr:=MyMemList;    (* MemList eintragen *)
  286.     execBase^.kickTagPtr:=Table;        (* TagTable eintragen *)
  287.  
  288.     Summe:=SumKickData();               (* Prüfsumme berechnen *)
  289.     execBase^.kickCheckSum:=Summe;      (* und eintragen *)
  290.  
  291.   END Install;                          (* fertig - keep resident! *)
  292.  
  293. (* Das sollte zwar das Hauptprogramm sein, aber mehr als die Gadget-Abfrage
  294.    tut es nicht ... das worauf's ankommt, ist die "INSTALL"-Prozedur. *)
  295.  
  296. BEGIN
  297.   TermProcedure(CleanUp);
  298.   SetUpStuff;
  299.  
  300.   LOOP
  301.     WaitPort(Fenster^.userPort);
  302.     Nachricht:=GetMsg(Fenster^.userPort);
  303.     WHILE Nachricht#NIL DO
  304.       class:=Nachricht^.class;
  305.       WhichGad:=Nachricht^.iAddress;
  306.       ReplyMsg(Nachricht);
  307.       IF (gadgetUp IN class) THEN CASE WhichGad^.gadgetID OF
  308.                                     0: |
  309.                                     1: DisplayInfo |
  310.                                     2: Install |
  311.                                     3: EXIT |
  312.                                   END;
  313.       END;
  314.       Nachricht:=GetMsg(Fenster^.userPort);
  315.     END;
  316.   END;
  317. END MakeKickRes.
  318.